package com.t.bricks.bussiness.service.stylepaperexamclass.impl;

import java.util.ArrayList;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.t.bricks.bussiness.db.dao.stylepaperexamclass.StylePaperExamClassDao;
import com.t.bricks.bussiness.db.entity.stylepaperexamclass.StylePaperExamClass;
import com.t.bricks.bussiness.db.entity.stylepaperexamclass.base.StylePaperExamClassBase;
import com.t.bricks.bussiness.model.stylepaperexamclass.ConditionStylePaperExamClass;
import com.t.bricks.bussiness.service.stylepaperexamclass.StylePaperExamClassService;

import com.t.bricks.model.MsgEmity;
import com.t.bricks.model.OrderInfoList;
import com.t.bricks.model.Page;
import com.t.bricks.utils.modules.web.ModuleUtil;

/**
 * 考卷样式题目类型分配'StylePaperExamClass表'基本业务操作类接口实现
 */
@Service
public class StylePaperExamClassServiceImpl implements StylePaperExamClassService<StylePaperExamClass> {

	@Autowired
	private StylePaperExamClassDao stylePaperExamClassDao;

	/**
	 * 新增
	 * @param stylePaperExamClass 考卷样式题目类型分配 对象实体,注意:跨包访问时可能会是json字符串
	 * @return MsgEmity
	 */
	@Override
	public MsgEmity add(Object stylePaperExamClass) {
		MsgEmity me = ModuleUtil.objToEntity(stylePaperExamClass, StylePaperExamClass.class);//转换数据,因为如果传递的是String,则可能是进行了跨包访问,要先用Json转换成实体对象
		if (!me.isSuccess()) {
			return me;
		}
		
		StylePaperExamClass stylePaperExamClassData = me.getData();
		
		me = ModuleUtil.validDbEntityByAdd(stylePaperExamClassData);// 通用的基本数据验证,如果要进行比较复杂的数据验证则可以屏蔽掉此方法自行编写
		if (!me.isSuccess()) {
			return me;
		}
		
		me = ModuleUtil.validDbEntityRepeatByAdd((StylePaperExamClassBase)stylePaperExamClassData, stylePaperExamClassDao);//查询数据库,验证数据是否有重复,因验证数据重复的方式比较复杂,直接在sql脚本中处理
		if (!me.isSuccess()) {// 在false下,如果返回8028则表示数据库查询异常,否则返回后4位是8026的数据,如xxx8026,从万位起表示从数据库中查询的结果
			String tmp = me.getData().toString();
			tmp = tmp.substring(tmp.length() -4, tmp.length());// 数据一定不小于4位
			return me.setData(tmp);// 发现重复数据后不进行其它业务处理则退出时,必须清理返回数据
		}
		
		stylePaperExamClassData.setiId(null);//清空记录编号
		
		me = ModuleUtil.supplyDbEntityAttrByAdd(stylePaperExamClassData);// 补充数据,如添加id、当前用户、当前时间等
		if (!me.isSuccess()) {
			return me;
		}
		
		return stylePaperExamClassDao.add(stylePaperExamClassData);
	}

	/**
	 * 删除
	 * @param iVersion 数据版本号
	 * @param iId 记录编号
	 * @return MsgEmity
	 */
	@Override
	public MsgEmity del(Integer iVersion, Long iId) {
		if (null == iId || iId.longValue() < 1) {
			return new MsgEmity(false, "信息编号参数错误，请刷新重试！", 8001);
		}
		
		if (null == iVersion || iVersion.intValue() < 1) {
			return new MsgEmity(false, "信息版本参数错误，其值应大于0！", 8002);
		}

		return stylePaperExamClassDao.del(iId, iVersion);
	}

	/**
	 * 修改
	 * @param stylePaperExamClass 考卷样式题目类型分配 对象实体,注意:跨包访问时可能会是json字符串
	 * @return MsgEmity
	 */
	@Override
	public MsgEmity edit(Object stylePaperExamClass) {
		MsgEmity me = ModuleUtil.objToEntity(stylePaperExamClass, StylePaperExamClass.class);//转换数据,因为如果传递的是String,则可能是进行了跨包访问,要先用Json转换成实体对象
		if (!me.isSuccess()) {
			return me;
		}
		
		StylePaperExamClass stylePaperExamClassData = me.getData();
		
		me = ModuleUtil.validBaseDataByEdit(stylePaperExamClassData);// 通用的基本数据验证(编辑),如果要进行比较复杂的数据验证则可以屏蔽掉此方法自行编写
		if (!me.isSuccess()) {
			return me;
		}
		
		me = ModuleUtil.validDbEntityRepeatByEdit((StylePaperExamClassBase)stylePaperExamClassData, stylePaperExamClassDao);// 查询数据库,验证数据是否有重复,因验证数据重复的方式比较复杂,直接在sql脚本中处理
		if (!me.isSuccess()) {// 在false下,如果返回8028则表示数据库查询异常,否则返回后4位是8026的数据,如xxx8026,从万位起表示从数据库中查询的结果
			String tmp = me.getData().toString();
			tmp = tmp.substring(tmp.length() -4, tmp.length());//数据一定不小于4位
			return me.setData(tmp);// 发现重复数据后不进行其它业务处理则退出时,必须清理返回数据
		}
		
		ModuleUtil.supplyDbEntityAttrByEdit(stylePaperExamClassData);// 补充数据
		
		//--提交数据保存--//
		return stylePaperExamClassDao.edit(stylePaperExamClassData);//注意:更新成功后对象属性iVersion值将被+1
	}

	/**
	 * 根据记录编号取对象
	 * @param iId
	 * @return MsgEmity
	 */
	@Override
	public MsgEmity findById(Long iId) {
		if (null == iId || iId.longValue() < 1) {
			return new MsgEmity(false, "编号不能为空！", 8001);
		}
		
		return stylePaperExamClassDao.findById(iId);
	}
	
	/**
	 * 根据字段名取指定记录编号的数据库表中对应字段的值
	 * @param iId 记录编号
	 * @param fieldNames 待取数据的字段名称集合
	 * @return MsgEmity
	 */
	@Override
	public MsgEmity getValueByFieldName(Long iId, List<String> fieldNames) {
		if (null == iId || iId.longValue() < 1) {
			return new MsgEmity(false, "编号不能为空！", 8001);
		}
		
		if (null == fieldNames || fieldNames.size() < 1) {
			return new MsgEmity(false, "待查询字段不能为空！", 8002);
		}
		
		return stylePaperExamClassDao.getValueByFieldName(iId, fieldNames);
	}
	
	/**
	 * 根据关键值取对象集合
	 * @param stylePaperExamClass 存放查询条件的StylePaperExamClass(考卷样式题目类型分配)对象实体,注意:跨包访问时可能会是json字符串
	 * @return MsgEmity
	 */
	@Override
	public MsgEmity findByKey(Object stylePaperExamClass) {
		if (null == stylePaperExamClass) {
			return new MsgEmity(false, "条件不能为空！", 8000);
		}
		
		MsgEmity me = ModuleUtil.objToEntity(stylePaperExamClass, StylePaperExamClass.class);//转换数据,因为如果传递的是String,则可能是进行了跨包访问,要先用Json转换成实体对象
		if (!me.isSuccess()) {
			return me;
		}
		
		StylePaperExamClass stylePaperExamClassData = me.getData();
		
		return stylePaperExamClassDao.findByKey(stylePaperExamClassData);
	}

	/**
	 * 根据关键值查数量
	 * @Param stylePaperExamClass 存放查询条件的StylePaperExamClass对象,注意:跨包访问时可能会是json字符串
	 * @return MsgEmity
	 */
	@Override
	public MsgEmity findCountByKey(Object stylePaperExamClass) {
		if (null == stylePaperExamClass) {
			return new MsgEmity(false, "条件对象不能为空！", 8000);
		}
		
		MsgEmity me = ModuleUtil.objToEntity(stylePaperExamClass, StylePaperExamClass.class);//转换数据,因为如果传递的是String,则可能是进行了跨包访问,要先用Json转换成实体对象
		if (!me.isSuccess()) {
			return me;
		}
		
		StylePaperExamClass stylePaperExamClassData = me.getData();
		
		return stylePaperExamClassDao.findCountByKey(stylePaperExamClassData);
	}
	
	/**
	 * 查询分页
	 * @param page 分页信息对象
	 * @param orders 排序数据集合
	 * @param sLikeStr 全文检索
	 * @param condition 查询条件对象
	 * @return MsgEmity
	 */
	@Override
	public MsgEmity findByPage(Page page, OrderInfoList orders, String sLikeStr,
			ConditionStylePaperExamClass condition) {
		if (null == page) {
			page = new Page(new ArrayList<StylePaperExamClass>());
		}

		return stylePaperExamClassDao.findByPage(page, orders, sLikeStr, condition);
	}

	/**
	 * 根据记录编号查询符合分页数据的某条记录
	 * @param iId
	 * @return MsgEmity
	 */
	@Override
	public MsgEmity findByPageRow(Long iId) {
		if (null == iId || iId.longValue() < 1) {
			return new MsgEmity(false, "编号不能为空！", 8001);
		}
		
		return stylePaperExamClassDao.findByPageRow(iId);
	}

	/**
	 * 直接调用数据库操作
	 * @param args 参数集合,注意:参数不要使用基本类型
	 * @return MsgEmity
	 */
	@Override
	public MsgEmity callMapping(Object...args) {
		String funName = ModuleUtil.parentMethodName();//待调用的mybits函数名与controller的接口名必须一致
		if (null == funName || "".equals(funName.trim())) {
			return new MsgEmity(false, "调用方法不明！", 8001);
		}
		
		if (null == args) {
			args = new Object[0];
		}
		
		Class<?>[] argsType = new Class<?>[args.length];
		for (int i = 0; i < args.length; i++) {
			argsType[i] = args[i].getClass();
		}
		
		return stylePaperExamClassDao.callMapping(funName, argsType, args);
	}

	/**
	 * 创建Excel文件内容
	 * @param orders 排序数据集合
	 * @param sLikeStr 全文检索
	 * @param condition 查询条件对象
	 * @return MsgEmity 返回结构中data为创建的经过压缩的Excel内容,接收端需要进行解压,msg为文件名
	 */
	@Override
	public MsgEmity export(OrderInfoList orders, String sLikeStr, ConditionStylePaperExamClass condition) {
		MsgEmity me = stylePaperExamClassDao.findByExport(orders, sLikeStr, condition);//查询数据
		if(!me.isSuccess()) {
			return me;
		}
		
		return ModuleUtil.crateExcel(me.getData(), "考卷样式题目类型分配.xls");//根据Excel的xml模板创建文件内容
	}
	
	/**
	 * 修改状态
	 * @param iId 编号
	 * @param iState 状态值
	 * @param iVersion 记录版本号
	 * @param sMemo 备注
	 * @return MsgEmity 返回执行情况
	 */
	@Override
	public MsgEmity changeState(Long iId, Integer iState, Integer iVersion, String sMemo) {
		if (null == iId || "".equals(iId.trim())) {
			return new MsgEmity(false, "编号不能为空！", 8001);
		}
		
		if (null == iState) {
			return new MsgEmity(false, "状态值不能为空！", 8002);
		}
		
		if (null == iVersion || iVersion.intValue() < 1) {
			return new MsgEmity(false, "版本号不该小于1！", 8003);
		}
		
		return stylePaperExamClassDao.changeState(iId, iState, iVersion, sMemo);
	}
	
	//----------------------------- 自动生成代码结束 -----------------------------//

}
